/******************************************************
 * @file input_manager.c
 * @author Destiny 
 * @brief 输入模块管理程序
 * @version 0.1
 * @date 2024-07-18
 *****************************************************/
#include <config.h>
#include <input_manager.h>
#include <string.h>
static PT_InputOpr g_ptInputOprHead;    /*链表头*/
/*初始化输入事件*/
static T_InputEvent g_tInputEvent = {
	.iX = 0 ,    
	.iY = 0 ,
	.iPressure = 0,
	.iWheel = 0,
};
static pthread_mutex_t g_tMutex  = PTHREAD_MUTEX_INITIALIZER;   /*互斥锁初始化*/
static pthread_cond_t  g_tConVar = PTHREAD_COND_INITIALIZER;    /*线程条件变量*/
/*
 * @description		    	: 向框架注册一个输入设备
 * @param - PT_InputOpr 	: 需要注册的输入设备结构体指针
 * @return 			    	: 0 成功;其他 失败
 */
int RegisterInputOpr(PT_InputOpr ptInputOpr)
{
	PT_InputOpr ptTmp;

	if (!g_ptInputOprHead)
	{
		g_ptInputOprHead   = ptInputOpr;
		ptInputOpr->ptNext = NULL;
	}
	else
	{
		ptTmp = g_ptInputOprHead;
		while (ptTmp->ptNext)
		{
			ptTmp = ptTmp->ptNext;
		}
		ptTmp->ptNext	  = ptInputOpr;
		ptInputOpr->ptNext = NULL;
	}

	return 0;
}
/*
 * @description		    : 打印所有输入设备名称
 */
void ShowInputOpr(void)
{
	int i = 0;
	PT_InputOpr ptTmp = g_ptInputOprHead;

	while (ptTmp)
	{
		printf("%02d %s\n", i++, ptTmp->name);
		ptTmp = ptTmp->ptNext;
	}
}
/*
 * @description		    : 输入设备事件处理线程函数
 * @param - pVoid		: 获取输入事件函数指针
 * @return 			    : NULL 成功;其他 失败
 */
static void *InputEventThreadFunction(void *pVoid)
{
	T_InputEvent tInputEvent;
	int (*GetInputEvent)(PT_InputEvent ptInputEvent);
	GetInputEvent = (int (*)(PT_InputEvent))pVoid;
	while (1)
	{
		if(0 == GetInputEvent(&tInputEvent))
		{
			/*唤醒*/
			pthread_mutex_lock(&g_tMutex);
			g_tInputEvent = tInputEvent;
			pthread_cond_signal(&g_tConVar);
			pthread_mutex_unlock(&g_tMutex);
		}
	}
	return NULL;
}
/*
 * @description		    : 所有输入设备初始化函数
 * @return 			    	: 0 成功;其他 失败
 */
int AllInputDevicesInit(void)
{
	PT_InputOpr ptTmp = g_ptInputOprHead;
	int iError = -1;

	while (ptTmp)
	{
		if (0 == ptTmp->DeviceInit())   /*执行初始化函数*/
		{
			/*为每一个输入设备创建一个处理线程*/
			pthread_create(&ptTmp->tTreadID, NULL, InputEventThreadFunction, ptTmp->GetInputEvent);		 	
			iError = 0;
		}
		ptTmp = ptTmp->ptNext;
	}
	return iError;
}
/*
 * @description		    	: 输入事件获取函数
 * @param - PT_InputEvent	: 输入事件描述结构体指针
 * @return 			    	: 0 成功;其他 失败
 */
int GetInputEvent(PT_InputEvent ptInputEvent)
{
	/*休眠等待输入事件发生*/
	pthread_mutex_lock(&g_tMutex);
	pthread_cond_wait(&g_tConVar, &g_tMutex);	

	/* 获取输入事件 */
	*ptInputEvent = g_tInputEvent;  /* g_tInputEvent为全局变量*/
	pthread_mutex_unlock(&g_tMutex);
	return 0;	
}
/*
 * @description		    	: 输入设备初始化函数
 * @return 			    	: 0 成功;其他 失败
 */
int InputInit(void)
{
	int iError = 0;
	iError |= TouchScreenInit();
	iError |= MouseInit();
	return iError;
}
